//#include <iostream>
//#include <queue>
//#include <vector>
//#include <deque>
//using std::cout;
//using std::cin;
//using std::endl;
//
//template<typename T>
//class MyQueue
//{
//public:
//	void Pop(const T& value)
//	{
//		if (!_q.empty() && value == _q.front())
//		{
//			_q.pop_front();
//		}
//	}
//
//	void Push(const T& value)
//	{
//		while (!_q.empty() && value > _q.back())
//		{
//			_q.pop_back();
//		}
//		_q.push_back(value);
//
//	}
//	T Front()
//	{
//		return _q.front();
//	}
//	bool Empty()
//	{
//		return _q.empty();
//	}
//private:
//	std::deque<T> _q;
//};
//
//
//int main()
//{
//	MyQueue<int> q;
//	std::vector<int> v{ 5,-1,6,8,0,4,3 };
//	for (int i = 0; i < v.size(); i++)
//	{
//		q.Push(v[i]);
//	}
//	while (!q.Empty())
//	{
//		cout << q.Front() << " ";
//		q.Pop(q.Front());
//	}
//	cout << endl;
//	return 0;
//}

#include <iostream>
#include <queue>

#include <vector>

using namespace std;
bool Compare(const int & a,const int &b)
{
	return a > b;
}
class COMPARE
{
public:
	bool operator()(int a,int b)
	{
		return a > b;
	}
};
int main()
{
	vector<int> v{ 5,9,8,88,-1,-2 };
	auto cmp = [](int a, int b) {return a > b; };
	priority_queue <int > q1(v.begin(), v.end());
	priority_queue<int, vector<int>, greater<int>> q2(v.begin(),v.end());
	priority_queue<int, vector<int>, bool(*)(int, int)> q3(v.begin(), v.end(),cmp);
	priority_queue<int, vector<int>, decltype(cmp)> q4(v.begin(), v.end(),cmp);
	priority_queue<int, vector<int>, decltype(&Compare) > q5(v.begin(), v.end(), Compare);
	priority_queue<int, vector<int>,COMPARE > q6(v.begin(), v.end());

	cout << "q1: ";
	while (!q1.empty())
	{
		cout << q1.top() << " ";
		q1.pop();
	}
	cout << endl;
	cout << "q2: ";
	while (!q2.empty())
	{
		cout << q2.top() << " ";
		q2.pop();
	}
	cout << endl;
	cout << "q3: ";
	while (!q3.empty())
	{
		cout << q3.top() << " ";
		q3.pop();
	}
	cout << endl;
	cout << "q4: ";
	while (!q4.empty())
	{
		cout << q4.top() << " ";
		q4.pop();
	}
	cout << endl; 
	cout << "q5: ";
	while (!q5.empty())
	{
		cout << q5.top() << " ";
		q5.pop();
	}
	cout << endl;
	cout << "q6: ";
	while (!q6.empty())
	{
		cout << q6.top() << " ";
		q6.pop();
	}
	cout << endl;
	return 0;
}